package com.qidian.zl.paper.util;

import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @author 戴着假发的程序
 */
public class StCache {
    // 缓存数据池
    private static Map<String,Object> pool = new ConcurrentHashMap<>();
    // 定时器的map
    private static Map<String, Timer> timerMap = new ConcurrentHashMap<>();
    // 根据key判断对应的数据是否在缓存中
    public static boolean cache(String key){
        return pool.containsKey(key);
    }

    /**
     * 清理缓存
     * @param key
     */
    public static void clean(String key){
        pool.remove(key);
        Timer timer = timerMap.remove(key);
        if(timer!=null){
            timer.cancel();
            timer = null;
        }
    }

    public static Object get(String key){
        return pool.get(key);
    }

    /**
     * 根据key获取缓存中的数据
     * @param key
     * @param clzz
     * @param <T>
     * @return
     */
    public static <T> T get(String key,Class<T> clzz){
        return (T) pool.get(key);
    }

    /**
     * 缓存数据，默认存储半小时
     * @param key
     * @param data
     */
    public static void put(String key,Object data){
        put(key,data,1000*60*30);
    }
    /**
     * 给缓存中存储一条数据
     * @param key
     * @param data
     * @param delay
     */
    public static void put(String key,Object data,long delay){
        // 跟新或者存储数据
        pool.put(key,data);
        // 申明一个定时器
        Timer timer = null;
        // 从定时器map中获取定时器对象
        timer = timerMap.get(key);
        if(timer!=null){
            //取消之前的任务
            timer.cancel();
            timer = null;
        }
        //重新创建一个定时器
        timer = new Timer();
        // 设置任务(任务线程，延迟时间)
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                // 要执行的任务
                pool.remove(key);// 清理缓存
                timerMap.remove(key); // 删除定时器
            }
        },delay);
    };
}
